const express = require('express')
const app = express()
const home = require('./route/home')
const admin = require('./route/admin')
const path = require('path')
// 导入express-session 模块  使用常量session接收
const session = require('express-session')
require('./model/connect')

// 导入config模块 会自动判断当前是什么开发环境并自动选择使用哪个json文件  将数据保存到json文件中
// 就可以将变量的值换做json文件的数据  用于抽离配置信息在json中
const config = require('config')

// 导入时间处理模板
const dateFormat = require('dateformat')
// 因为要使用时间处理模块 就要设置 template.defaults.imports 但是这个属性又是数于 art-template 的我们下面使用的模板引擎是
// express-art-template 所以还需要导入这个模板引擎  不懂为啥
const template = require('art-template')

// 设置模板引擎导入模板
template.defaults.imports.dateFormat = dateFormat

// 开放静态资源文件夹
app.use(express.static(path.join(__dirname, 'public')))
// 配置session  还传入了一个对象  secret key 是密钥的意思 表示需要对cookie，session加密
app.use(session({
  secret: 'secret key',
  resave: false,
  // 保存未初始化  也就是是否保存还没有初始化完成的cookie
  saveUninitialized: false,
  cookie: {
    // 设置cookie最大过期时间
    maxAge: 24 * 60 * 60 * 1000
  }
}))

// 设置使用哪个引擎渲染模板
app.engine('html', require('express-art-template'))
// 设置模板根目录
app.set('views', path.join(__dirname, 'views'))
// 设置模板默认后缀
app.set('view engine', 'html')

// 我们希望在没有登录时不能访问user这个页面 而是直接跳转回 login页面 让用户登录
// 那我们就需要先拦截请求判断状态
// 这个拦截需要放在app.js中 不要放到admin.js中  因为我们是拦截 /admin 的子页面 判断子页面访问的页面是否为 index
// 如果放到了 admin.js 就不可以 因为admin.js 就是专门处理admin子页面的请求的  第一个参数不知道怎么写 无法直接拦截所有的子页面的请求
// 需要每个页面都进行判断  代码太冗余
app.use('/admin', (req, res, next) => {
  // 判断用户访问的是否是登录页面        判断用户是否已经登录   这里还需要判断请求方式是否为GET
  // 这里会拦截所有的请求 我们提交表单的请求也在这里被拦截了 那么无论如何 这里都是登录页面不能跳转到其他页面
  if (req.url !== '/index' && !req.session.username && req.method === 'GET') {
    // 如果访问地址不是登录页面 用户没有登录且请求方式为GET 就话就重定向到登陆页面
    res.redirect('/admin/index')
  } else {
    if (req.session.userRole === '普通用户') {
      return res.redirect('/home/index')
    }
    // 用户访问的是登录页面  或 用户已经登录 就继续
    next()
  }
})

// 要使用二级路由 这里的一级路由一定要使用use
// html文件会请求外链文件 请求的地址就是标签中的地址 例如 <link rel = "stylesheet" href = "/admin/css/base.css">
// 请求的地址就是 localhost/admin/css/base.css  相当于直接加在了localhost  因为我们将html文件单独拿出来放到了views文件夹中
// 所以可能会出现请求不到的情况  我们需要修改一下html中的请求地址
// 1. ../=父级目录
// 2. ./与不加 例如 ./css与css=当前目录
// 3. /=代表文件所在的根目录  例如 /css 表示根目录下的css文件
// 所以如果我们要修改请求地址的话 最好是使用绝对地址 绝对地址就直接从根目录访问就是了  根目录就是public目录  按照这个根目录来修改请求地址就可以了
app.use('/home', home)

app.use('/admin', admin)

// 错误处理中间件    错误集中处理   集中跳转
// app.use((err, req, res, next) => {
//   // 这里接收到的err 就是刚刚next中的参数  这里将字符串转换为对象类型
//   const obj = JSON.parse(err)
//   let arr = []
//   // 因为接收的错误对象 有不同的参数 不能采用定式的拼接 需要动态的拼接  有什么就拼接什么
//   for (let i in obj) {
//     if (i !== 'path') {
//       // 将 所有的参数和值以字符串的形式放到数组中去
//       arr.push(i + '=' + obj[i])
//     }
//   }
//   // 这里使用了join方法  可以让数组中的值用传入的参数拼接起来我们这里使用&就可以作为query 的形式了
//   res.redirect(`${obj.path}?${arr.join('&')}`)
// })

app.listen(80)

console.log('网站服务器启动成功')
